package generator;



import generator.workflow.Parallelizer;

import org.springframework.context.support.FileSystemXmlApplicationContext;


/**
 * Esta es la clase que contiene al método main del generador de código paralelizado.
 * Se vale de un archivo de configuración para obtener la instancia del paralelizador
 * que se empleará durante el proceso. Si no se pasa como parámetro al main el archivo
 * de configuración se tomará desde la ruta config/Parallelizer-config.xml.
 * @author Hirsch-Fernández 
 */
public class ParallelCodeGenerator {
		
	/**
	 * paralelizador que será empleado para efectuar el proceso de gridificación.
	 */
	Parallelizer parallelizerInstance;
		
	
	/**Ruta por defecto del archivo de configuración que se utilizará para instanciar el generador
	 * de código. Dicho archivo contiene el spring-bean que representa el gridificador a utilizar.
	 * */
	String ParallelCodeGeneratorConf = "config"+System.getProperty("file.separator")+"Parallelizer-config.xml";

	
	/**método que inicializa el gridificador a utilizar.
	 * @param confFile
	 *			ruta del archivo que contiene el spring-bean que representa la instancia del 
	 *gridificador a utilizar.
	 **/
	protected void init(String parallelizerSelectionFile){
		
		try{
			String[] data = new String[]{parallelizerSelectionFile};
			FileSystemXmlApplicationContext ctx = new FileSystemXmlApplicationContext(data);				
			parallelizerInstance = (Parallelizer)ctx.getBean("parallelizer");			
		} catch (Exception e) {
			System.err.println("Falló inicialización del generador de código. Asegúrese de haber indicado correctamente la instanciación del mismo");
			e.printStackTrace();
		}		 
			
	}
	
	/**Constructor de la clase {@link ParallelCodeGenerator} que permite obtener una instancia configurada
	 * a partir del archivo pasado como parámetro.
	 * @param confFile
	 * 			archivo de configuración que indica qué gridificador utilizar bajo la forma de un
	 * spring-bean*/
	public ParallelCodeGenerator(String parallelizerSelectionFile){		
		init(parallelizerSelectionFile);
		
	}
	
	/**Constructor de la clase {@link ParallelCodeGenerator} que permite obtener una instancia configurada
	 * a partir del archivo Parallelizer-config.xml que se encuentra en la ruta por defecto*/
	public ParallelCodeGenerator(){		 
		this.init(ParallelCodeGeneratorConf);				
	}		
	
	/**Método mediante el cual se efectúa la tarea de gridificación*/
	protected void generate(){
		System.out.print("Paralelizing application...");
		parallelizerInstance.parallelizeApplication();
		System.out.println("Finished");
	}	


	/**@param args 
	 * 			espera recibir 0 o 1 parámetro. En caso de pasarse el parámetro, debe corresponderse
	 * a la ruta completa del archivo que contiene el spring-bean que representa el gridificador a utilizar
	 * @see {@link ParallelCodeGenerator}*/
	public static void main(String[] args) throws Exception {
		ParallelCodeGenerator pcg;
		if(args.length == 1)
			pcg = new ParallelCodeGenerator(args[0]);
		else
			pcg = new ParallelCodeGenerator();
		
		pcg.generate();		
	}	
	
}
